import { WebviewWindow } from "@tauri-apps/api/webviewWindow";
import { LogicalPosition, LogicalSize } from "@tauri-apps/api/dpi";

// 窗口池 - 用于复用窗口实例，后面需要的再用窗口池管理，需要频繁创建窗口的情形
// const windowPool = new Map();

const appName = '阿瑞斯仿微信Tauri'

// 窗口配置优化函数
const optimizeWindowConfig = (config) => {
  return {
    ...config,
    // 设置默认值
    width: config.width || 800,
    height: config.height || 600,
    resizable: config.resizable ?? true,
    maximizable: config.maximizable ?? true,
    minimizable: config.minimizable ?? true,
    closable: config.closable ?? true,
    center: config.center ?? true,
  };
};

export const useWindow = () => {
  return {
    /**
     * @desc: 常规的创建窗口【性能一般，方便使用】
     * @param {string} route - 路由名称，用于创建窗口，如'/chat'，其实是createWindow配置项里的label，需要保证唯一，如果需要创建多个窗口，请使用不同的路由名称
     * @param {Object} config - 窗口配置项，参考：https://tauri.app/zh-cn/reference/javascript/api/namespacewebviewwindow/
     * @param {boolean} isBlurHide - 失去焦点时、是否隐藏窗口，默认false
     * @author: yanrui
     * @time: 2025-10-28 11:50:08
     */
    async createWindow(route, config, isBlurHide = false) {
      console.log('config', config)
      const win = new WebviewWindow(route, optimizeWindowConfig({
        ...config,
        title: config.title || appName,
        url: config?.url || `/${route}`,
      }));
      await win.once("tauri://created", async () => {
        console.log(`${route}窗口创建成功`);
        // 此参数用于监听，失去焦点时，是否隐藏窗口
        if(isBlurHide) {
          // 获取子窗口实例
          const childWindow = await WebviewWindow.getByLabel(route)

          // 监听该子窗口的焦点变化
          const unlisten = await childWindow.onFocusChanged(async ({ payload: focused }) => {
            if (!focused) {
              console.log('子窗口失去焦点，准备关闭')
              await win.hide()
              unlisten() // 取消监听
            }
          })
        }
      });
      await win.once("tauri://error", async function (e) {
        // 如果窗口已存在，则聚焦显示，如果是最小化状态，则取消最小化，都是细节呀
        // 暂时先用关键词判断是否存在，以后再查查对应的错误码
        if(e.payload && e.payload.includes('already exists')) {
          if(await win.isMinimized()) {
            await win.unminimize();
          } else {
            await win.setFocus()
          }
        }
        console.log(`${route}窗口创建失败：`, e);
      });
    },

    /**
     * @desc: 设置窗口的通用属性【可见性、位置、任务栏、是否聚焦、窗口大小、是否置顶】
     * @author: yanrui
     * @time: 2025-10-30 15:32:29
     *
     * @eg: 设置chat窗口不可见，如下：
     * setWindowCommonAttribute({
     *   label: 'chat',
     *   visible: true,
     * })
     */
    async setWindowCommonAttribute({
      label = null, // 窗口label，如果为空，则使用当前窗口
      visible = null, // 窗口是否可见
      focus = null, // 窗口是否聚焦
      skipTaskbar = null, // 窗口是否在任务栏中显示
      position = [], // 窗口位置
      size = [], // 窗口大小
      isTop = false, // 是否置顶
    }) {
      try {
        const win = label ?
          await WebviewWindow.getByLabel(label) :
          await WebviewWindow.getCurrent();
        if(win) {
          // 可见性
          if(visible !== null) {
            visible ? await win.show() : await win.hide()
          }
          // 聚焦，不用设置失去焦点事件
          if(focus !== null) {
            focus ? await win.setFocus() : ''
          }
          // 任务栏显示/隐藏
          if(skipTaskbar !== null) {
            await win.setSkipTaskbar(skipTaskbar)
          }
          // 位置
          if(position.length > 0) {
            await win.setPosition(new LogicalPosition(position[0], position[1]));
          }
          // 尺寸
          if(size.length > 0) {
            await win.setSize(new LogicalSize(size[0], size[1]));
          }
          // 置顶
          if(isTop) {
            await win.setAlwaysOnTop(true);
          }
        }
      } catch (error) {
        console.error(`设置窗口${label || "当前" }通用属性性失败:`, error);
        return false;
      }
    },

    // 设置窗口显示且聚焦/隐藏，同时任务栏显示/隐藏  【仅针对主窗口使用，处理各种状态】其他的一般设置，请用`setWindowCommonAttr`方法
    async setWindowVisibilityAndTaskbar(route, visible) {
      try {
        const win = await WebviewWindow.getByLabel(route);
        if (win) {
          if (visible) {
            // 如果是最小化状态，则直接取消最小化，否则就显示窗口和任务栏(并且设置聚焦，有时会在其他窗口下面)
            if(await win.isMinimized()) {
              await win.unminimize();
            } else {
              await win.show();
              await win.setFocus()
              await win.setSkipTaskbar(false);
            }
          } else {
            await win.hide();
            await win.setSkipTaskbar(true);
          }
          return true;
        }
      } catch (error) {
        console.error(`设置窗口${route}可见性和任务栏显示失败:`, error);
        return false;
      }
    },

    // 获取窗口状态
    async getWindowStatus(route) {
      try {
        const win = await WebviewWindow.getByLabel(route);
        if (win) {
          const isVisible = await win.isVisible();
          const position = await win.position();
          const size = await win.size();
          return { exists: true, visible: isVisible, position, size };
        }
        return { exists: false };
      } catch (error) {
        console.error(`获取窗口${route}状态失败:`, error);
        return { exists: false, error: error.message };
      }
    },

    // 返回该窗口的实例
    async getWindowByRoute(route) {
      return await WebviewWindow.getByLabel(route);
    },

    // 关闭当前窗口
    async closeCurrentWindow() {
      await WebviewWindow.getCurrent().close();
    },

    // 关闭(销毁)目标窗口
    async destroyWindow(route) {
      const win = await WebviewWindow.getByLabel(route);
      if (win) {
        await win.close();
      }
    },

    // 设置当前窗口显示、并聚焦，用于减少白屏问题，需要配合在创建窗口时设置 visible: false, focus: false,
    async setCurrentWindowShowAndFocus() {
      const win = await WebviewWindow.getCurrent();
      await win.show();
      await win.setFocus();
    }
  }
};
